package servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.hibernate.Session;

import beans.AtuacaoProfissional;
import beans.Endereco;
import beans.FormacaoAcademica;
import beans.FormacaoComplementar;
import beans.Informacoes;
import beans.ProducaoBibliografica;
import beans.Usuario;
import beans.dao.UsuarioDAO;

public class CadastroCurriculoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public CadastroCurriculoServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processaCurriculo(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processaCurriculo(request, response);
	}

	public void processaCurriculo(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		boolean formAcamVazio = true;
		boolean formCompVazio = true;
		boolean atuaProfVazio = true;
		boolean prodBiblVazio = true;

		request.setCharacterEncoding("UTF-8");

		/* Identificacao */
		Informacoes informacoes = new Informacoes();

		informacoes.setNome(request.getParameter("nome"));
		informacoes.setNomeCitacoes(request.getParameter("nomeCitacoes"));
		informacoes.setNacionalidade(request.getParameter("nacionalidade"));
		informacoes.setCpf(request.getParameter("cpf"));
		informacoes.setEstadoCivil(request.getParameter("estadoCivil"));
		informacoes.setTipoSexo(request.getParameter("tipoSexo"));
		informacoes.setEmail(request.getParameter("email"));
		informacoes.setEstadoNascimento(request
				.getParameter("estadoNascimento"));
		informacoes.setCidadeNascimento(request
				.getParameter("cidadeNascimento"));
		informacoes.setDataNascimento(request.getParameter("dataNascimento"));
		informacoes.setRg(request.getParameter("rg"));
		informacoes.setOrgaoEmissor(request.getParameter("orgaoEmissor"));
		informacoes.setEstadoIdentidade(request
				.getParameter("estadoIdentidade"));
		informacoes.setDataEmissao(request.getParameter("dataEmissao"));
		informacoes.setPaisEmissao(request.getParameter("paisEmissao"));
		informacoes.setNomePai(request.getParameter("nomePai"));
		informacoes.setNomeMae(request.getParameter("nomeMae"));

		/* Endereco */
		Endereco endereco = new Endereco();

		endereco.setLogradouroRes(request.getParameter("logradouroRes"));
		endereco.setBairroRes(request.getParameter("bairroRes"));
		endereco.setComplementoRes(request.getParameter("complementoRes"));
		endereco.setCepRes(request.getParameter("cepRes"));
		endereco.setCidadeRes(request.getParameter("cidadeRes"));
		endereco.setEstadoRes(request.getParameter("estadoRes"));
		endereco.setTefefoneRes(request.getParameter("tefefoneRes"));
		endereco.setCelularRes(request.getParameter("celularRes"));
		endereco.setHomePageRes(request.getParameter("homePageRes"));
		endereco.setEmailPublico(request.getParameter("emailPublico"));

		/* Formacao Academica */
		String[] nivel = request.getParameterValues("nivel");
		String[] curso = request.getParameterValues("curso");
		String[] instituicao = request.getParameterValues("instituicao");
		String statusCurso;
		String[] dataInicio = request.getParameterValues("dataInicio");
		String[] dataConclusao = request.getParameterValues("dataConclusao");
		String[] duracao = request.getParameterValues("duracao");

		List<FormacaoAcademica> formAcadLista = new ArrayList<FormacaoAcademica>();

		if (nivel != null) {
			formAcamVazio = false;

			for (int i = 0; i < nivel.length; i++) {
				FormacaoAcademica formAcad = new FormacaoAcademica();

				formAcad.setNivel(nivel[i]);
				formAcad.setCurso(curso[i]);
				formAcad.setInstituicao(instituicao[i]);
				statusCurso = request.getParameter("statusCurso" + (i + 1));

				formAcad.setStatusCurso(statusCurso);
				formAcad.setDataInicio(dataInicio[i]);
				formAcad.setDataConclusao(dataConclusao[i]);
				formAcad.setDuracao(duracao[i]);

				formAcadLista.add(formAcad);
			}
		}

		/* Formacao Complementar */
		String[] nivelFormCompl = request.getParameterValues("nivelFormCompl");
		String[] cursoFormCompl = request.getParameterValues("cursoFormCompl");
		String[] instituicaoFormCompl = request
				.getParameterValues("instituicaoFormCompl");
		String statusCursoFormCompl;
		String[] dataInicioFormCompl = request
				.getParameterValues("dataInicioFormCompl");
		String[] dataConclusaoFormCompl = request
				.getParameterValues("dataConclusaoFormCompl");
		String[] duracaoFormCompl = request
				.getParameterValues("duracaoFormCompl");

		List<FormacaoComplementar> formCompLista = new ArrayList<FormacaoComplementar>();

		if (nivelFormCompl != null) {
			formCompVazio = false;

			for (int i = 0; i < nivelFormCompl.length; i++) {
				FormacaoComplementar formComp = new FormacaoComplementar();

				formComp.setNivelFormCompl(nivelFormCompl[i]);
				formComp.setCursoFormCompl(cursoFormCompl[i]);
				formComp.setInstituicaoFormCompl(instituicaoFormCompl[i]);
				statusCursoFormCompl = request
						.getParameter("statusCursoFormCompl" + (i + 1));
				formComp.setStatusCursoFormCompl(statusCursoFormCompl);
				formComp.setDataInicioFormCompl(dataInicioFormCompl[i]);
				formComp.setDataConclusaoFormCompl(dataConclusaoFormCompl[i]);
				formComp.setDuracaoFormCompl(duracaoFormCompl[i]);

				formCompLista.add(formComp);
			}
		}

		/* Atuação Profissional */

		String[] nomeInstituicao = request
				.getParameterValues("nomeInstituicao");
		String[] tipoVinculo = request.getParameterValues("tipoVinculo");
		String[] enqProfissional = request
				.getParameterValues("enqProfissional");
		String[] dataInicioAtProf = request
				.getParameterValues("dataInicioAtProf");
		String[] dataConclusaoAtProf = request
				.getParameterValues("dataConclusaoAtProf");

		List<AtuacaoProfissional> atuaProfLista = new ArrayList<AtuacaoProfissional>();

		if (tipoVinculo != null) {
			atuaProfVazio = false;

			for (int i = 0; i < tipoVinculo.length; i++) {
				AtuacaoProfissional atuaProf = new AtuacaoProfissional();

				atuaProf.setNomeInstituicao(nomeInstituicao[i]);
				atuaProf.setTipoVinculo(tipoVinculo[i]);
				atuaProf.setEnqProfissional(enqProfissional[i]);
				atuaProf.setDataInicioAtProf(dataInicioAtProf[i]);
				atuaProf.setDataConclusaoAtProf(dataConclusaoAtProf[i]);

				atuaProfLista.add(atuaProf);
			}
		}

		/* Produção Bibliográfica */
		String[] tipoProducao = request.getParameterValues("tipoProducao");

		List<ProducaoBibliografica> prodBiblioLista = new ArrayList<ProducaoBibliografica>();

		if (tipoProducao != null) {

			prodBiblVazio = false;
			int j = 0;
			int k = 0;
			int l = 0;

			for (int i = 0; i < tipoProducao.length; i++) {

				ProducaoBibliografica prodBiblio = new ProducaoBibliografica();

				System.out.println("Tipo producao: "+tipoProducao[i]);
				if (tipoProducao[i].equals("Artigo Completo")) {

					String[] issnPeriodico = request
							.getParameterValues("issnPeriodico");
					String[] nomePeriodico = request
							.getParameterValues("nomePeriodico");
					String[] volPeriodico = request
							.getParameterValues("volPeriodico");
					String[] edicaoPeriodico = request
							.getParameterValues("edicaoPeriodico");
					String[] pgInicialPeriodico = request
							.getParameterValues("pgInicialPeriodico");
					String[] doiPeriodico = request
							.getParameterValues("doiPeriodico");
					String[] tituloPeriodico = request
							.getParameterValues("tituloPeriodico");
					String[] anoPeriodico = request
							.getParameterValues("anoPeriodico");
					String[] idiomaPeriodico = request
							.getParameterValues("idiomaPeriodico");
					String[] meioDivulgacaoPeriodico = request
							.getParameterValues("meioDivulgacaoPeriodico");
					String[] homePagePeriodico = request
							.getParameterValues("homePagePeriodico");
					String[] autorPeriodico = request
							.getParameterValues("autorPeriodico");

					prodBiblio.setTipoProducao(tipoProducao[i]);
					prodBiblio.setIssnPeriodico(issnPeriodico[j]);
					prodBiblio.setNomePeriodico(nomePeriodico[j]);
					prodBiblio.setVolPeriodico(volPeriodico[j]);
					prodBiblio.setEdicaoPeriodico(edicaoPeriodico[j]);
					prodBiblio.setPgInicialPeriodico(pgInicialPeriodico[j]);
					prodBiblio.setDoiPeriodico(doiPeriodico[j]);
					prodBiblio.setTituloPeriodico(tituloPeriodico[j]);
					prodBiblio.setAnoPeriodico(anoPeriodico[j]);
					prodBiblio.setIdiomaPeriodico(idiomaPeriodico[j]);
					prodBiblio
							.setMeioDivulgacaoPeriodico(meioDivulgacaoPeriodico[j]);
					prodBiblio.setHomePagePeriodico(homePagePeriodico[j]);
					prodBiblio.setAutorPeriodico(autorPeriodico[j]);

					prodBiblioLista.add(prodBiblio);

					j++;

				} else if (tipoProducao[i]
						.equals("Livro ou Capítulo de Livro")) {

					String[] tipoProducaoLivro = request
							.getParameterValues("tipoProducaoLivro");
					String[] issnLivro = request
							.getParameterValues("issnLivro");
					String[] anoLivro = request.getParameterValues("anoLivro");
					String[] autorEditorLivro = request
							.getParameterValues("autorEditorLivro");
					String[] doiLivro = request.getParameterValues("doiLivro");
					String[] tipoLivro = request
							.getParameterValues("tipoLivro");
					String[] naturezaLivro = request
							.getParameterValues("naturezaLivro");
					String[] tituloLivro = request
							.getParameterValues("tituloLivro");
					String[] anoDoLivro = request
							.getParameterValues("anoDoLivro");
					String[] paisLivro = request
							.getParameterValues("paisLivro");
					String[] idiomaLivro = request
							.getParameterValues("idiomaLivro");
					String[] meioDivulgacaoLivro = request
							.getParameterValues("meioDivulgacaoLivro");
					String[] homePageLivro = request
							.getParameterValues("homePageLivro");
					String[] autorLivro = request
							.getParameterValues("autorLivro");

					prodBiblio.setTipoProducao(tipoProducao[i]);
					prodBiblio.setTipoProducaoLivro(tipoProducaoLivro[k]);
					prodBiblio.setIssnLivro(issnLivro[k]);
					prodBiblio.setAnoLivro(anoLivro[k]);
					prodBiblio.setAutorEditorLivro(autorEditorLivro[k]);
					prodBiblio.setDoiLivro(doiLivro[k]);
					prodBiblio.setTipoLivro(tipoLivro[k]);
					prodBiblio.setNaturezaLivro(naturezaLivro[k]);
					prodBiblio.setTituloLivro(tituloLivro[k]);
					prodBiblio.setAnoDoLivro(anoDoLivro[k]);
					prodBiblio.setPaisLivro(paisLivro[k]);
					prodBiblio.setIdiomaLivro(idiomaLivro[k]);
					prodBiblio.setMeioDivulgacaoLivro(meioDivulgacaoLivro[k]);
					prodBiblio.setHomePageLivro(homePageLivro[k]);
					prodBiblio.setAutorLivro(autorLivro[k]);

					prodBiblioLista.add(prodBiblio);

					k++;

				} else {

					String[] tipoResumo = request
							.getParameterValues("tipoResumo");
					;
					String[] tituloResumo = request
							.getParameterValues("tituloResumo");
					String[] anoResumo = request
							.getParameterValues("anoResumo");
					String[] paisResumo = request
							.getParameterValues("paisResumo");
					String[] idiomaResumo = request
							.getParameterValues("idiomaResumo");
					String[] meioDivulgacaoResumo = request
							.getParameterValues("meioDivulgacaoResumo");
					String[] homePageResumo = request
							.getParameterValues("homePageResumo");

					prodBiblio.setTipoProducao(tipoProducao[i]);
					prodBiblio.setTipoResumo(tipoResumo[l]);
					prodBiblio.setTituloResumo(tituloResumo[l]);
					prodBiblio.setAnoResumo(anoResumo[l]);
					prodBiblio.setPaisResumo(paisResumo[l]);
					prodBiblio.setIdiomaResumo(idiomaResumo[l]);
					prodBiblio.setMeioDivulgacaoResumo(meioDivulgacaoResumo[l]);
					prodBiblio.setHomePageResumo(homePageResumo[l]);

					prodBiblioLista.add(prodBiblio);

					l++;
				}

			}
		}

		HttpSession session = request.getSession();

		Usuario usuario = (Usuario) session.getAttribute("usuario");
		/* Atualizando campos de busca do usuário */
		usuario.setNome(request.getParameter("nome"));
		usuario.setNomeCitacoes(request.getParameter("nomeCitacoes"));

		session.removeAttribute("usuario");
		session.setAttribute("usuario", usuario);

		UsuarioDAO DAO = new UsuarioDAO();
		DAO.beginTransaction();
		Usuario u = DAO.retrieve(usuario.getEmail());

		/* Se o usuario ja tinha informacoes deleta as anteriores */
		Informacoes infoAntigo = u.getInformacoes();
		Endereco endAntigo = u.getEndereco();
		List<FormacaoAcademica> formAcadAntigo = u.getFormacaoAcademica();
		List<FormacaoComplementar> formCompAntigo = u.getFormacaoComplementar();
		List<AtuacaoProfissional> atuaProfAntigo = u.getAtuacaoProfissional();
		List<ProducaoBibliografica> prodBiblAntigo = u.getProducaoBibliografica();
		

		/* Fazendo isto tudo � atualizado corretamente no banco de dados, por�m os dados
		 * excluidos apenas perdem a refer�ncia com o usu�rio, continuando no banco.
		 */
		u.setInformacoes(informacoes);
		u.setNome(request.getParameter("nome"));
		u.setNomeCitacoes(request.getParameter("nomeCitacoes"));
		u.setEndereco(endereco);
		u.setFormacaoAcademica(formAcadLista);
		u.setFormacaoComplementar(formCompLista);
		u.setAtuacaoProfissional(atuaProfLista);
		u.setProducaoBibliografica(prodBiblioLista);

		/*
		 * Salva denovo no banco com td atualizado, pode fazer isso depois de
		 * setar o resto do curriculo
		 */
		DAO.saveAndUpdate(u);
		DAO.commit();

		/*
		 * Deleto a informacao antiga, é necessario esperar dar update no
		 * usuario para nao violar a FK
		 */
		DAO.beginTransaction();
		Session hbSession = DAO.getSession();
		
		if(infoAntigo != null){
			infoAntigo = DAO.retrieveInfo(infoAntigo.getId());
			hbSession.delete(infoAntigo);
		}
		if(endAntigo != null){
			endAntigo = DAO.retrieveEnd(endAntigo.getId());
			hbSession.delete(endAntigo);
		}
		
		if(atuaProfAntigo != null){
			for(AtuacaoProfissional a:atuaProfAntigo){
				AtuacaoProfissional antigo = DAO.retrieveAtuaProf(a.getId());
				hbSession.delete(antigo);
			}
		}
		
		if(formAcadAntigo != null){
			for(FormacaoAcademica f:formAcadAntigo){
				FormacaoAcademica antigo = DAO.retrieveFormAcadem(f.getId());
				hbSession.delete(antigo);
			}
		}
		
		if(formCompAntigo != null){
			for(FormacaoComplementar f:formCompAntigo){
				FormacaoComplementar antigo = DAO.retrieveFormComp(f.getId());
				hbSession.delete(antigo);
			}
		}
		
		if(prodBiblAntigo != null){
			for(ProducaoBibliografica p:prodBiblAntigo){
				ProducaoBibliografica antigo = DAO.retrieveProdBiblio(p.getId());
				hbSession.delete(antigo);
			}
		}
		DAO.commit();
		


		String url = null;

		url = "recuperadadosservlet?acao=view";

		response.setContentType("text/html;charset=UTF-8");

		RequestDispatcher dispatcher = request.getRequestDispatcher(url);
		dispatcher.forward(request, response);

	}

}
